home *** CD-ROM | disk | FTP | other *** search
/ GameStar 2004 April / Gamestar_61_2004-04_dvdb.iso / DVDStar / Editace / hltp.exe / {app} / Applications / QuArK / plugins / entdef2qrk.py < prev    next >
Text File  |  2004-01-05  |  20KB  |  573 lines

  1. """   QuArK  -  Quake Army Knife
  2.  
  3. Python macros available for direct call by QuArK
  4. """
  5.  
  6. #
  7. #$Header: /cvsroot/quark/runtime/plugins/entdef2qrk.py,v 1.6 2003/12/17 13:58:59 peter-b Exp $
  8. #
  9.  
  10. import time, sys
  11.  
  12. class Key:
  13.     def __init__(self):
  14.         self.m_keyname = None
  15.         self.m_desc = ""
  16.         self.m_defaultvalue = None
  17.  
  18.     def SetKeyname(self, keyname):
  19.         self.m_keyname = keyname
  20.  
  21.     def SetDesc(self, desc):
  22.         self.m_desc = desc
  23.  
  24.     def SetDefaultValue(self, defvalue):
  25.         self.m_defaultvalue = defvalue
  26.  
  27.     def GetDefaultValue(self):
  28.         return self.m_defaultvalue
  29.  
  30.     def GenerateFolder(self, indent):
  31.         if (self.m_defaultvalue is None) or (self.m_defaultvalue == ""):
  32.             return None
  33.         indent[self.m_keyname] = str(self.m_defaultvalue)
  34.         return None
  35.  
  36.     def GenerateForm(self, indent):
  37.         return "This is pure virtual"
  38.  
  39.     def AddKeyFlag(self, value, desc, selected):
  40.         return "This is pure virtual"
  41.  
  42.     def AddKeyChoice(self, value, desc):
  43.         return "This is pure virtual"
  44.  
  45. class KeyString(Key):
  46.     def __init__(self):
  47.         Key.__init__(self)
  48.  
  49.     def GenerateForm(self, indent):
  50.         s = quarkx.newobj(self.m_keyname + ":")
  51.         # s["txt"] = "&"
  52.         s["hint"] = self.m_desc
  53.         indent.appenditem(s)
  54.         return s
  55.  
  56. class KeyNumeric(Key):
  57.     def __init__(self):
  58.         Key.__init__(self)
  59.  
  60.     def GenerateForm(self, indent):
  61.         s = quarkx.newobj(self.m_keyname + ":")
  62.         # s["txt"] = "&"
  63.         s["hint"] = self.m_desc
  64.         indent.appenditem(s)
  65.         return None
  66.  
  67. class KeyFlags(Key):
  68.     def __init__(self):
  69.         Key.__init__(self)
  70.         self.m_flags = []
  71.  
  72.     def AddKeyFlag(self, value, desc, selected):
  73.         self.m_flags = self.m_flags + [(value, desc)]
  74.         if (int(selected) > 0):
  75.             try:
  76.                 oldvalue = int(self.GetDefaultValue())
  77.             except:
  78.                 oldvalue = 0
  79.             self.SetDefaultValue(oldvalue + int(value))
  80.  
  81.     def GenerateForm(self, indent):
  82.         s = ""
  83.         nl = "" # no first newline
  84.         for value, desc in self.m_flags:
  85.           s = quarkx.newobj(self.m_keyname + ":")
  86.           # s["txt"] = "&"
  87.           # s["hint"] = ""
  88.           s["typ"] = "X"+value
  89.           s["cap"] = desc
  90.           indent.appenditem(s)
  91.         return None
  92.  
  93. class KeyChoices(Key):
  94.     def __init__(self):
  95.         Key.__init__(self)
  96.         self.m_choices = []
  97.  
  98.     def AddKeyChoice(self, value, desc):
  99.         self.m_choices = self.m_choices + [(value, desc)]
  100.  
  101.     def GenerateForm(self, indent):
  102.         s = quarkx.newobj(self.m_keyname + ":")
  103.         # s["txt"] = "&"
  104.         s["hint"] = self.m_desc
  105.         s["typ"] = "C"
  106.         indent.appenditem(s)
  107.         it = ""
  108.         vl = ""
  109.         c = 0
  110.         for value, desc in self.m_choices:
  111.           it = it + desc
  112.           vl = vl + value
  113.           c = c + 1
  114.           if (c <> len(self.m_choices)):
  115.             it = it + "\r"
  116.             vl = vl + "\r"
  117.         s["items"] = it
  118.         s["values"] = vl
  119.         return None
  120.  
  121. ## --------
  122.  
  123. INHERITPREFIX = "t_"
  124.  
  125. class Entity:
  126.     def __init__(self):
  127.         self.m_classname = None
  128.         self.m_desc = ""
  129.         self.m_keys = []
  130.         self.m_inherit = []
  131.         self.m_size = None
  132.         self.m_color = None
  133.         self.m_help = None
  134.  
  135.     def Type(self):
  136.         raise "This is pure virtual"
  137.  
  138.     def SetClassname(self, classname):
  139.         self.m_classname = classname
  140.  
  141.     def SetDesc(self, desc):
  142.         self.m_desc = desc
  143.  
  144.     def SetSize(self, sizeargs):
  145.         if (len(sizeargs) == 6):
  146.             self.m_size = (float(sizeargs[0]), float(sizeargs[1]), float(sizeargs[2]),
  147.                            float(sizeargs[3]), float(sizeargs[4]), float(sizeargs[5]))
  148.  
  149.     def SetHelp(self, helpstring):
  150.         self.m_help = helpstring
  151.  
  152.     def InheritsFrom(self, inherit):
  153.         self.m_inherit = self.m_inherit + [INHERITPREFIX + inherit]
  154.  
  155.     def AddKey(self, key):
  156.         self.m_keys = self.m_keys + [key]
  157.  
  158.     def TypeForm(self):
  159.         return ":form"
  160.  
  161.     def GetFolderStuff(self, s):
  162.         return ""
  163.  
  164.     def GenerateFolder(self, indent):
  165.         def SortedAppendItem(obj, subitem):
  166.             i = 0
  167.             for s in obj.subitems:
  168.                 if (s.shortname.lower() > subitem.shortname.lower()):
  169.                     break
  170.                 i = i + 1
  171.             obj.insertitem(i, subitem)
  172.  
  173.         s = quarkx.newobj(self.m_classname + self.Type())
  174.         folder = indent
  175.         p = s.name.find("_")
  176.         if (p == -1):
  177.             folder = indent.findname("other entities.qtxfolder")
  178.             if (folder is None):
  179.                 folder = quarkx.newobj("other entities.qtxfolder")
  180.                 SortedAppendItem(indent, folder)
  181.         else:
  182.             folder = indent.findname(s.name[:p+1]+"* entities.qtxfolder")
  183.             if (folder is None):
  184.                 folder = quarkx.newobj(s.name[:p+1]+"* entities.qtxfolder")
  185.                 SortedAppendItem(indent, folder)
  186.         SortedAppendItem(folder, s)
  187.         self.GetFolderStuff(s)
  188.         s[";desc"] = self.m_desc
  189.         founddefaults = 0
  190.         for key in self.m_keys:
  191.             k = key.GenerateFolder(s)
  192.  
  193.     def GenerateForm(self, indent):
  194.         s = quarkx.newobj(self.m_classname + self.TypeForm())
  195.         if (self.m_help is not None):
  196.             s["help"] = self.m_help
  197.         if (self.m_size is not None):
  198.             s["bbox"] = self.m_size
  199.         for key in self.m_keys:
  200.             key.GenerateForm(s)
  201.         # Place "<keyword>=!"-statements at the _end_ of ":form" definitions, because of a problem which Decker found but can't solve.
  202.         for inh in self.m_inherit:
  203.             s.specificadd(inh+"=!")
  204.         indent.appenditem(s)
  205.  
  206. class BrushEntity(Entity):
  207.     def __init__(self):
  208.         Entity.__init__(self)
  209.  
  210.     def Type(self):
  211.         return ":b"
  212.  
  213.     def GetFolderStuff(self, s):
  214.         if (self.m_classname.lower() == "worldspawn"):
  215.             return
  216.         s["angle"] = "360"
  217.         s[";incl"] = "defpoly"
  218.  
  219. class PointEntity(Entity):
  220.     def __init__(self):
  221.         Entity.__init__(self)
  222.  
  223.     def Type(self):
  224.         return ":e"
  225.  
  226.     def GetFolderStuff(self, s):
  227.         s["angle"] = "360"
  228.         s["origin"] = "0 0 0"
  229.  
  230. class InheritEntity(Entity):
  231.     def __init__(self):
  232.         Entity.__init__(self)
  233.  
  234.     def SetClassname(self, classname):
  235.         self.m_classname = INHERITPREFIX + classname
  236.  
  237.     def GenerateFolder(self, indent):
  238.         return
  239.  
  240.     def Type(self):
  241.         return
  242.  
  243.     def TypeForm(self):
  244.         return ":incl"
  245.  
  246. ## --------
  247.  
  248. theEntities = []
  249. theEntity = None
  250. theKey = None
  251. currentclassname = None
  252. currentsize = None
  253. currentspawnflagbit = None
  254. currentcomment = None
  255.  
  256. def CheckQUAKED(token):
  257.     if not (token == "QUAKED"):
  258.         raise "Expected 'QUAKED' token, but found: "+token
  259.  
  260. def CreateClass(token):
  261.     global currentclassname, currentspawnflagbit, currentsize
  262.     CloseClass("--CloseByCreateClass--")
  263.     # Create entity
  264.     currentclassname = token
  265.     currentspawnflagbit = None
  266.     currentsize = None
  267.     currentcomment = None
  268.  
  269. def CloseClass(token):
  270.     global theEntity, theEntities
  271.     # Add to large list of entities
  272.     if (theEntity is not None):
  273.         theEntities = theEntities + [theEntity]
  274.  
  275. def MakePointEntity(token):
  276.     global theEntity, currentclassname
  277.     theEntity = PointEntity()
  278.     theEntity.SetClassname(currentclassname)
  279.  
  280. def MakeBrushEntity(token):
  281.     global theEntity, currentclassname
  282.     theEntity = BrushEntity()
  283.     theEntity.SetClassname(currentclassname)
  284.  
  285. def AppendSize(token):
  286.     global currentsize
  287.     if (currentsize is None):
  288.         currentsize = [token]
  289.     else:
  290.         currentsize = currentsize + [token]
  291.  
  292. def SetSize(token):
  293.     global currentsize, theEntity
  294.     theEntity.SetSize(currentsize)
  295.     currentsize = None
  296.  
  297. def AddSpawnflag(token):
  298.     global currentspawnflagbit, theKey
  299.     if (currentspawnflagbit == None):
  300.         currentspawnflagbit = 1
  301.         CloseSpawnflag("--CloseByAddSpawnflag--")
  302.         theKey = KeyFlags()
  303.         theKey.SetKeyname("spawnflags")
  304.     # Only append spawnflag-tokens that are not "x" nor "-"
  305.     if not (token == "x" or token == "-" or token == "?"):
  306.         theKey.AddKeyFlag(str(currentspawnflagbit), token, 0)
  307.     # Always double the spawnflagbit-value
  308.     currentspawnflagbit = currentspawnflagbit * 2
  309.  
  310. def CloseSpawnflag(token):
  311.     global theEntity, theKey
  312.     if (theKey is not None):
  313.         theEntity.AddKey(theKey)
  314.         theKey = None
  315.  
  316. def AddComment(token):
  317.     global currentcomment
  318.     token = token.replace("\t", "    ")
  319.     if (currentcomment is None):
  320.         currentcomment = token
  321.     else:
  322.         currentcomment = currentcomment + "\r" + token
  323.  
  324. def DoneComment(token):
  325.     global currentcomment, theEntity
  326.     theEntity.SetHelp(currentcomment)
  327.     currentcomment = None
  328.  
  329.  
  330. ## ------------
  331.  
  332. def readentirefile(file):
  333.     f = open(file, "r")
  334.     filecontents = ""
  335.     while 1:
  336.         line = f.readline()
  337.         if not line:
  338.             break
  339.         line = line.strip()
  340.         if line:
  341.             filecontents = filecontents + line + "\n"
  342.     f.close()
  343.     return filecontents
  344.  
  345. TYPE_UNKNOWN    = 0
  346. TYPE_NUMERIC    = 1
  347. TYPE_STRING     = 2
  348. TYPE_SYMBOL     = 3
  349. TYPE_ANY        = 4
  350. TYPE_ALFABETIC  = 5
  351. TYPE_EOC        = 6 # End-Of-Comment == "*/"
  352. TYPE_SPLITTER_AT        = 10 # @
  353. TYPE_SPLITTER_COLON     = 11 # :
  354. TYPE_SPLITTER_EQUAL     = 12 # =
  355. TYPE_SPLITTER_SQUARE_B  = 13 # [
  356. TYPE_SPLITTER_SQUARE_E  = 14 # ]
  357. TYPE_SPLITTER_PRNTSHS_B = 15 # (
  358. TYPE_SPLITTER_PRNTSHS_E = 16 # )
  359. TYPE_SPLITTER_COMMA     = 17 # ,
  360. TYPE_QUESTION_MARK      = 18 # ?
  361. TYPE_ASTERISK           = 19 # *
  362. TYPE_FORWARD_SLASH      = 20 # /
  363. TYPE_NEWLINE            = 21 # \n
  364.  
  365. CHARS_NUMERIC           = "0123456789"
  366. CHARS_NUMERIC_SYMBOLS   = "-."
  367. CHARS_ALFABETIC         = "_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
  368.  
  369. def getnexttoken(srcstring):
  370.     # Remove heading spaces/tabs
  371.     i = 0
  372.     while (srcstring[i] in " \t"):
  373.         i = i + 1
  374.  
  375.     if (srcstring[i] in "{"):
  376.         while (not srcstring[i] in "}"):
  377.             i = i + 1
  378.         i = i + 1
  379.  
  380.     token_is = TYPE_UNKNOWN
  381.     token = ""
  382.  
  383.     # Determine token-type
  384.     if (srcstring[i] in CHARS_NUMERIC and not srcstring[i+1] in CHARS_ALFABETIC) \
  385.     or (srcstring[i] in CHARS_NUMERIC_SYMBOLS and srcstring[i+1] in CHARS_NUMERIC):
  386.         # Numeric
  387.         token_is = TYPE_NUMERIC
  388.         while (srcstring[i] in (CHARS_NUMERIC_SYMBOLS + CHARS_NUMERIC)):
  389.             token = token + srcstring[i]
  390.             i = i + 1
  391.     elif (srcstring[i] in CHARS_ALFABETIC):
  392.         # Alfabetic
  393.         token_is = TYPE_ALFABETIC
  394.         while (srcstring[i] in (CHARS_ALFABETIC + CHARS_NUMERIC + "*")):
  395.             token = token + srcstring[i]
  396.             i = i + 1
  397.     else:
  398.         # Character-symbol
  399.         token = srcstring[i]
  400.         i = i + 1
  401.         if (token == "?"):
  402.             token_is = TYPE_QUESTION_MARK
  403.         elif (token == "*"):
  404.             token_is = TYPE_ASTERISK
  405.         elif (token == "/"):
  406.             token_is = TYPE_FORWARD_SLASH
  407.         elif (token == "("):
  408.             token_is = TYPE_SPLITTER_PRNTSHS_B
  409.         elif (token == ")"):
  410.             token_is = TYPE_SPLITTER_PRNTSHS_E
  411.         elif (token == "\n"):
  412.             token_is = TYPE_NEWLINE
  413.             if (srcstring[i] == "\r"):
  414.                 i = i + 1
  415.         elif (token == "\r"):
  416.             token_is = TYPE_NEWLINE
  417.             if (srcstring[i] == "\n"):
  418.                 i = i + 1
  419.  
  420.     return token, token_is, srcstring[i:]
  421.  
  422. def getwholeline(srcstring):
  423.     token = ""
  424.     i = 0
  425.     srclen = len(srcstring)
  426.     while (i < srclen) and (not (srcstring[i] in "\n\r")):
  427.         token = token + srcstring[i]
  428.         i = i + 1
  429.     i = i + 1
  430.     if (token[-2:] == "*/"):
  431.         token_is = TYPE_EOC
  432.     else:
  433.         token_is = TYPE_STRING
  434.     return token, token_is, srcstring[i:]
  435.  
  436.  
  437. statediagram =                                                                                  \
  438. {                                                                                               \
  439. # Current state            Token-type to go to ->    Next state             Function to call with token \
  440.  'STATE_UNKNOWN'        :[(TYPE_FORWARD_SLASH      ,'STATE_COMMENTBEGIN'   ,None)               \
  441.                          ,(TYPE_NEWLINE            ,'STATE_UNKNOWN'        ,None)             ] \
  442.                                                                                                 \
  443. ,'STATE_COMMENTBEGIN'   :[(TYPE_ASTERISK           ,'STATE_QUAKEEDBEGIN'   ,None)               \
  444.                          ,(TYPE_FORWARD_SLASH      ,'STATE_EOL_COMMENT'    ,None)             ] \
  445.                                                                                                 \
  446. ,'STATE_EOL_COMMENT'    :[(TYPE_NEWLINE            ,'STATE_UNKNOWN'        ,None)               \
  447.                          ,(TYPE_ANY                ,'STATE_EOL_COMMENT'    ,None)             ] \
  448.                                                                                                 \
  449. ,'STATE_QUAKEEDBEGIN'   :[(TYPE_ALFABETIC          ,'STATE_CLASSNAME'      ,CheckQUAKED)      ] \
  450.                                                                                                 \
  451. ,'STATE_CLASSNAME'      :[(TYPE_ALFABETIC          ,'STATE_CLASSCOLOR'     ,CreateClass)      ] \
  452.                                                                                                 \
  453. ,'STATE_CLASSCOLOR'     :[(TYPE_SPLITTER_PRNTSHS_B ,'STATE_CLASSCOLOR2'    ,None)             ] \
  454. ,'STATE_CLASSCOLOR2'    :[(TYPE_NUMERIC            ,'STATE_CLASSCOLOR3'    ,None)             ] \
  455. ,'STATE_CLASSCOLOR3'    :[(TYPE_NUMERIC            ,'STATE_CLASSCOLOR4'    ,None)             ] \
  456. ,'STATE_CLASSCOLOR4'    :[(TYPE_NUMERIC            ,'STATE_CLASSCOLOR5'    ,None)             ] \
  457. ,'STATE_CLASSCOLOR5'    :[(TYPE_SPLITTER_PRNTSHS_E ,'STATE_CLASSSIZE'      ,None)             ] \
  458.                                                                                                 \
  459. ,'STATE_CLASSSIZE'      :[(TYPE_SPLITTER_PRNTSHS_B ,'STATE_CLASSSIZE2'     ,MakePointEntity)    \
  460.                          ,(TYPE_QUESTION_MARK      ,'STATE_SPAWNFLAGS'     ,MakeBrushEntity)  ] \
  461.                                                                                                 \
  462. ,'STATE_CLASSSIZE2'     :[(TYPE_NUMERIC            ,'STATE_CLASSSIZE3'     ,AppendSize)       ] \
  463. ,'STATE_CLASSSIZE3'     :[(TYPE_NUMERIC            ,'STATE_CLASSSIZE4'     ,AppendSize)       ] \
  464. ,'STATE_CLASSSIZE4'     :[(TYPE_NUMERIC            ,'STATE_CLASSSIZE5'     ,AppendSize)       ] \
  465. ,'STATE_CLASSSIZE5'     :[(TYPE_SPLITTER_PRNTSHS_E ,'STATE_CLASSSIZE6'     ,None)             ] \
  466. ,'STATE_CLASSSIZE6'     :[(TYPE_SPLITTER_PRNTSHS_B ,'STATE_CLASSSIZE7'     ,None)             ] \
  467. ,'STATE_CLASSSIZE7'     :[(TYPE_NUMERIC            ,'STATE_CLASSSIZE8'     ,AppendSize)       ] \
  468. ,'STATE_CLASSSIZE8'     :[(TYPE_NUMERIC            ,'STATE_CLASSSIZE9'     ,AppendSize)       ] \
  469. ,'STATE_CLASSSIZE9'     :[(TYPE_NUMERIC            ,'STATE_CLASSSIZE10'    ,AppendSize)       ] \
  470. ,'STATE_CLASSSIZE10'    :[(TYPE_SPLITTER_PRNTSHS_E ,'STATE_SPAWNFLAGS'     ,SetSize)          ] \
  471.                                                                                                 \
  472. ,'STATE_SPAWNFLAGS'     :[(TYPE_ALFABETIC          ,'STATE_SPAWNFLAGS'     ,AddSpawnflag)       \
  473.                          ,(TYPE_UNKNOWN            ,'STATE_SPAWNFLAGS'     ,AddSpawnflag)       \
  474.                          ,(TYPE_NEWLINE            ,'STATE_COMMENT'        ,CloseSpawnflag)   ] \
  475.                                                                                                 \
  476. ,'STATE_COMMENT'        :[(TYPE_EOC                ,'STATE_UNKNOWN'        ,DoneComment)        \
  477.                          ,(TYPE_STRING             ,'STATE_COMMENT'        ,AddComment)       ] \
  478. }
  479.  
  480. ## --------
  481.  
  482. import quarkpy.qutils
  483. import quarkx
  484.  
  485. def makeqrk(root, filename, gamename):
  486.     quarkx.msgbox("Please note, this is not always 100% accurate and will duplicate\nexisting entities and possibly miss some out.\n\nYou may need to handedit the .qrk file. For help with this,\nfeel free to ask questions at the QuArK forum:\n\nhttp://groups.yahoo.com/group/quark/messages\n", quarkpy.qutils.MT_INFORMATION, quarkpy.qutils.MB_OK)
  487.     global currentclassname
  488.     srcstring = readentirefile(filename)
  489.     state = 'STATE_UNKNOWN'
  490.     while (len(srcstring) > 1):
  491.         if (state == 'STATE_COMMENT'):
  492.             # Special case, to keep the comment-lines intact, and not tokenized
  493.             token, token_is, srcstring = getwholeline(srcstring)
  494.         else:
  495.             token, token_is, srcstring = getnexttoken(srcstring)
  496.         # Figure out, if the token_is type is expected or not
  497.         expectedtypes = []
  498.         newstate = None
  499.         typestates = statediagram[state]
  500.         for type, nextstate, func in typestates:
  501.             if (type == token_is or type == TYPE_ANY or (token_is == TYPE_QUESTION_MARK and func == AddSpawnflag)):
  502.                 # We found the correct token type, now remember what new state we're going into
  503.                 newstate = nextstate
  504.                 break
  505.             expectedtypes = expectedtypes + [type]
  506.         if newstate is None:
  507.             print "Parse error: Got type", token_is, "but expected type(s);", expectedtypes
  508.             print "Debug: Last classname was =", currentclassname
  509.             print "Debug:", srcstring[:64]
  510.             print "Debug - Associated function: ", func
  511.             raise "Parse error!"
  512.         if (func is not None):
  513.             # This state have a function attached to it. Call it giving it the found token.
  514.             func(token)
  515.         # Change to new state
  516.         state = newstate
  517.     CloseClass("--EndByEOF--")
  518.     indent = 2
  519.     r_tbx = quarkx.newobj("Toolbox Folders.qtx")
  520.     r_tbx["Toolbox"] = "New map items..."
  521.     r_tbx.flags = r_tbx.flags | quarkpy.qutils.OF_TVSUBITEM
  522.     root.appenditem(r_tbx)
  523.  
  524.     e_tbx = quarkx.newobj("Entities for "+gamename.split("\\")[-1]+".qtxfolder")
  525.     e_tbx[";desc"] = "Created from "+filename.split("\\")[-1]
  526.     r_tbx.appenditem(e_tbx)
  527.  
  528.     r_tbx["Root"] = e_tbx.name
  529.  
  530.     for ent in theEntities:
  531.         ent.GenerateFolder(e_tbx)
  532.  
  533.     f_tbx = quarkx.newobj("Entity Forms.fctx")
  534.     f_tbx.flags = f_tbx.flags | quarkpy.qutils.OF_TVSUBITEM
  535.     root.appenditem(f_tbx)
  536.  
  537.     for ent in theEntities:
  538.         ent.GenerateForm(f_tbx)
  539.     root.refreshtv()
  540.  
  541.     quarkx.msgbox("The .DEF file have now almost been converted to QuArK format.\n\nWhat remains is to save it as a 'Structured text for hand-editing (*.qrk)' file.\n\nIf you encounter any problems using this 'Convert from QeRadiant .DEF file' utility, please post a mail in the QuArK-forum.", quarkpy.qutils.MT_INFORMATION, quarkpy.qutils.MB_OK)
  542.  
  543. import quarkpy.qentbase
  544. quarkpy.qentbase.RegisterEntityConverter("QERadiant .def file", "QERadiant .def file", "*.def", makeqrk)
  545.  
  546. #
  547. #$Log: entdef2qrk.py,v $
  548. #Revision 1.6  2003/12/17 13:58:59  peter-b
  549. #- Rewrote defines for setting Python version
  550. #- Removed back-compatibility with Python 1.5
  551. #- Removed reliance on external string library from Python scripts
  552. #
  553. #Revision 1.5  2003/06/21 14:46:22  nerdiii
  554. #I modified the .def importer to work around three bugs:
  555. #1. {...} entries are ignored now, caused parse errors before
  556. #2. tokens starting with a digit such as '1st_left' are no longer treated as
  557. #a number
  558. #3. some entities have unused flags, that are named '?' in QERadiant. The
  559. #importer used to interpret them as special characters.
  560. #
  561. #Revision 1.4  2002/04/17 12:32:20  decker_dk
  562. #Minor problem, which caused it to not convert the MOHAA .DEF file correctly.
  563. #
  564. #Revision 1.3  2002/02/05 18:32:58  decker_dk
  565. #Corrected a problem with debug() calls
  566. #
  567. #Revision 1.2  2001/12/02 09:57:45  decker_dk
  568. #Removing 'os' from the import list, and some other minor fixes.
  569. #
  570. #Revision 1.1  2001/10/05 17:56:42  decker_dk
  571. #Created QERadiant .DEF file to .QRK file converter.
  572. #
  573.